/**
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。

注意子串要与 words 中的单词完全匹配，中间不能有其他字符，但不需要考虑 words 中单词串联的顺序。

 

示例 1：

输入：
  s = "barfoothefoobarman",
  words = ["foo","bar"]
输出：[0,9]
解释：
从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。
输出的顺序不重要, [9,0] 也是有效答案。
示例 2：

输入：
  s = "wordgoodgoodgoodbestword",
  words = ["word","good","best","word"]
输出：[]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/substring-with-concatenation-of-all-words
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
func findSubstring(s string, words []string) []int {
    if len(s) == 0 || len(words) == 0{
        return []int{}
    }
    oneWordLen, wordNum := len(words[0]), len(words)
    m,res := make(map[string]int,0), make([]int,0)
    for _, w := range words{
        m[w]++
    }
    for i := 0; i < oneWordLen; i++{
        left, right, m1, count := i, i, make(map[string]int,0), 0
        for right + oneWordLen <= len(s){
            w := s[right:right+oneWordLen]
            right += oneWordLen
            if m[w] == 0{
                count = 0
                left = right
                m1 = make(map[string]int,0)
            }else{
                m1[w]++
                count++
                for m1[w] > m[w]{
                    t_w := s[left:left+oneWordLen]
                    m1[t_w]--
                    count--
                    left += oneWordLen
                }
            }
            if count == wordNum{
               res = append(res, left)
            }
        }
    }
    return res
}